/**
 * 防抖函数
 * @param func
 * @param delay
 * @returns {function(...[*]=)}
 */
export function debounce(func, delay) {
  let timer = null
  return function(...args) {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      func.apply(this, args)
    }, delay)
  }
}

/**
 * 时间格式化
 * @param date
 * @param fmt
 * @returns {*}
 */
export function dateFormat(date, fmt) {
  const o = {
    "M+": date.getMonth() + 1, //月份
    "d+": date.getDate(), //日
    "H+": date.getHours(), //小时
    "m+": date.getMinutes(), //分
    "s+": date.getSeconds(), //秒
    "q+": Math.floor((date.getMonth() + 3) / 3), //季度
    "S": date.getMilliseconds() //毫秒
  };
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length))
  for (let k in o)
    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)))
  return fmt
}

/**
 * 计算函数，解决小数点丢失是精度的问题
 * @type {{add(*, *): number, div(*, *): (number), sub(*=, *=): *, mul(*, *): number}}
 */
export const calc = {
  /**
   * 加法函数，用来得到精确的加法结果
   * @param arg1
   * @param arg2
   * @returns {number}
   */
  add(arg1, arg2) {
    arg1 = arg1.toString(), arg2 = arg2.toString()
    const arg1Arr = arg1.split("."), arg2Arr = arg2.split("."), d1 = arg1Arr.length == 2 ? arg1Arr[1] : "", d2 = arg2Arr.length == 2 ? arg2Arr[1] : ""
    const maxLen = Math.max(d1.length, d2.length)
    const m = Math.pow(10, maxLen)
    const result = Number(((arg1 * m + arg2 * m) / m).toFixed(maxLen))
    const d = arguments[2]
    return typeof d === "number" ? Number((result).toFixed(d)) : result
  },

  /**
   * 减法函数，用来得到精确的减法结果
   * @param arg1
   * @param arg2
   * @returns {*}
   */
  sub(arg1, arg2) {
    return this.add(arg1, -Number(arg2), arguments[2])
  },

  /**
   * 乘法函数，用来得到精确的乘法结果
   * @param arg1
   * @param arg2
   * @returns {number}
   */
  mul(arg1, arg2) {
    let r1 = arg1.toString(), r2 = arg2.toString(), m, resultVal, d = arguments[2]
    m = (r1.split(".")[1] ? r1.split(".")[1].length : 0) + (r2.split(".")[1] ? r2.split(".")[1].length : 0)
    resultVal = Number(r1.replace(".", "")) * Number(r2.replace(".", "")) / Math.pow(10, m)
    return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)))
  },

  /**
   * 除法函数，用来得到精确的除法结果
   */
  div(arg1, arg2) {
    let r1 = arg1.toString(), r2 = arg2.toString(), m, resultVal, d = arguments[2]
    m = (r2.split(".")[1] ? r2.split(".")[1].length : 0) - (r1.split(".")[1] ? r1.split(".")[1].length : 0)
    resultVal = Number(r1.replace(".", "")) / Number(r2.replace(".", "")) * Math.pow(10, m)
    return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)))
  }
}